#ifndef __FATTESTER_H
#define __FATTESTER_H

#include "./SYSTEM/sys/sys.h"
#include "./FATFS/source/ff.h"

/* -------------------------------------------- 功能开关定义 ------------------------------------------- */

/* 定义是否支持文件系统测试功能
 * 1, 支持(开启);
 * 0, 不支持(关闭);
 */
#define USE_FATTESTER         1

/* -------------------------------------------- 测试结构体定义 ------------------------------------------- */

/* 如果支持文件系统测试 ,则使能以下代码 */
#if USE_FATTESTER == 1
 
/* FATFS 测试用结构体 */
typedef struct
{
    FIL *file;          /* 文件结构体指针 */
    FILINFO fileinfo;   /* 文件信息 */
    DIR dir;            /* 目录 */
    uint8_t *fatbuf;    /* 读写缓存 */
    uint8_t initflag;   /* 初始化标志 */
} _m_fattester;

extern _m_fattester fattester;      /* FATFS测试结构体 */

/* -------------------------------------------- 函数声明 ----------------------------------------------- */

uint8_t mf_init(void);              /* 初始化文件系统测试 */
void mf_free(void);                 /* 释放文件系统测试时申请的内存 */

uint8_t mf_mount(uint8_t* path, uint8_t mt);        /* 挂载磁盘 */
uint8_t mf_open(uint8_t*path, uint8_t mode);        /* 打开文件 */
uint8_t mf_close(void);                             /* 关闭文件 */
uint8_t mf_read(uint16_t len);                      /* 读取文件数据 */
uint8_t mf_write(uint8_t*dat, uint16_t len);        /* 写入文件数据 */
uint8_t mf_opendir(uint8_t* path);                  /* 打开目录 */
uint8_t mf_closedir(void);                          /* 关闭目录 */
uint8_t mf_readdir(void);                           /* 读取目录项 */
uint8_t mf_scan_files(uint8_t * path);              /* 扫描文件列表 */
uint32_t mf_showfree(uint8_t *drv);                 /* 显示剩余容量 */
uint8_t mf_lseek(uint32_t offset);                  /* 文件指针定位 */
uint32_t mf_tell(void);                             /* 获取文件指针位置 */
uint32_t mf_size(void);                             /* 获取文件大小 */
uint8_t mf_mkdir(uint8_t*pname);                    /* 创建目录 */
uint8_t mf_fmkfs(uint8_t* path, uint8_t opt, uint16_t au);  /* 格式化磁盘 */
uint8_t mf_unlink(uint8_t *pname);                  /* 删除文件/目录 */
uint8_t mf_rename(uint8_t *oldname, uint8_t* newname);      /* 重命名文件/目录 */
void mf_getlabel(uint8_t *path);                    /* 获取磁盘标签 */
void mf_setlabel(uint8_t *path);                    /* 设置磁盘标签 */
void mf_gets(uint16_t size);                        /* 读取字符串 */
uint8_t mf_putc(uint8_t c);                         /* 写入单个字符 */
uint8_t mf_puts(uint8_t*c);                         /* 写入字符串 */

#endif

#endif
